package com.xyz.FileTest.FileRead;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Main {
    public static void main(String[] args) throws IOException {
        /*
        // 相对路径需要从当前项目文件的根目录开始来写才行
        // 即 java 项目的相对路径起始位置，是项目的根目录
        InputStream input = new FileInputStream("src/com/xyz/FileTest/FileRead/readme.txt");
        for (;;) {
            int n = input.read(); // 反复调用read()方法，直到返回-1
            if (n == -1) {
                break;
            }
            System.out.println(n); // 打印byte的值
        }
        input.close(); // 关闭流
        */
        readFile("src/com/xyz/FileTest/FileRead/readme.txt");
        //readFile1("src/com/xyz/FileTest/FileRead/readme.txt");
        //readFileByCatch("src/com/xyz/FileTest/FileRead/readme.txt");
    }

    public static void readFile(String path) throws IOException {
        InputStream input = null;
        try {
            input = new FileInputStream(path);
            int n;
            while ((n = input.read()) != -1) { // 利用while同时读取并判断
                System.out.println(n);
            }
        }
        catch (IOException e)
        {
            // 捕获输入输出异常
            System.out.println(e.getMessage());
        }
        catch (Exception e)
        {
            // 捕获其他异常
            System.out.println(e.getMessage());
        }
        finally {
            if (input != null) { input.close(); }
        }
    }

    public static void readFile1(String path) throws IOException {
        // 能够自动关闭并释放对象内存的 try(){}结构
        // 需要关闭的对象，应该创建（new ）在 try 的() 中
        try (InputStream input = new FileInputStream(path)) {
            int n;
            while ((n = input.read()) != -1) {
                System.out.println(n);
            }
        } // 编译器在此自动为我们写入finally并调用close()
    }

    // 缓冲
    public static void readFileByCatch(String path) throws IOException {
        try (InputStream input = new FileInputStream(path)) {
            // 定义1000个字节大小的缓冲区:
            byte[] buffer = new byte[1000];
            int n;
            while ((n = input.read(buffer)) != -1) { // 读取到缓冲区
                System.out.println("read " + n + " bytes.");
            }
        }
    }
}
